package org.yray.sip.rtp.sender;


import lombok.extern.slf4j.Slf4j;
import org.yray.sip.factory.inet.IMediaFactory;
import org.yray.sip.server.SipSession;
import org.yray.sip.utils.ByteUtils;
import org.yray.sip.utils.IcspBeanHolder;

import java.util.Arrays;

@Slf4j
public abstract class RtpPacket implements PacketInte {


    /***
     * 0000   00 00 5e 00 01 07 7c 8a e1 70 c7 b8 08 00 45 00
     0010   00 c8 87 7b 00 00 c8 11 3c 11 ac 82 0d 1f ac a8
     0020   c8 4e 0f a0 69 54 00 b4 5e b5 |80 08 |72 b0 |00 00 01 40  从这里开始8008|seq|timestamp
     0030    45 26 70 d5| d5 d5 d5 d5 d5 d5 d5 d5 d5 55 ssrc 后面的payload
     0040   d5 d5 d5 d5 d5 d5 d5 d5 d5 d5 d5 55 d5 55 d5 d5
     0050   d5 d5 d5 55 d5 d5 d5 d5 d5 d5 d5 d5 d5 d5 d5 d5
     0060   d5 55 d5 d5 55 d5 d5 d5 d5 d5 d5 d5 d5 d5 d5 d5
     0070   d5 d5 55 d5 d5 d5 d5 d5 d5 d5 d5 55 d5 d5 d5 d5
     0080   55 d5 55 d5 d5 d5 d5 d5 55 d5 d5 55 d5 d5 d5 d5
     0090   d5 d5 d5 d5 d5 d5 d5 d5 d5 d5 d5 d5 d5 d5 d5 d5
     00a0   d5 d5 d5 d5 d5 d5 d5 d5 d5 d5 d5 d5 d5 d5 d5 55
     00b0   d5 d5 d5 55 55 d5 d5 d5 d5 d5 d5 d5 d5 d5 d5 d5
     00c0   d5 d5 d5 d5 d5 d5 d5 d5 d5 d5 d5 d5 d5 d5 55 d5
     00d0   d5 d5 d5 d5 d5 d5
     * @param ssrc
     * @param seq
     * @param timestamp
     * @return
     */
    public static byte[] builtTs(long ssrc,int seq,long timestamp)
    {
        //头部12加+每160一个包
        byte[] result= new byte[12+ SipSession.PCMA_STEP_SIZE];
        Arrays.fill(result,(byte)229);
        System.arraycopy(ByteUtils.uIntToByteWord(HEX_PCMA_MARK),0,result,0,2);
        System.arraycopy(ByteUtils.uIntToByteWord(seq),0,result,2,2);
        System.arraycopy(ByteUtils.uLongToByteWord(timestamp),0,result,4,4);
        System.arraycopy(ByteUtils.uLongToByteWord(ssrc),0,result,8,4);
        //后面媒体数据

        return result;
    }


    public final static IMediaFactory getMediaFactory()
    {
        return IcspBeanHolder.getBean(IMediaFactory.class);
    }

    public static byte[] builtPcma(long ssrc,int seq,long timestamp,byte[] bs)
    {
        byte[] sendPacket=new byte[12+SipSession.PCMA_STEP_SIZE];
        System.arraycopy(ByteUtils.uIntToByteWord(HEX_PCMA),0,sendPacket,0,2);
        System.arraycopy(ByteUtils.uIntToByteWord(seq),0,sendPacket,2,2);
        System.arraycopy(ByteUtils.uLongToByteWord(timestamp),0,sendPacket,4,4);
        System.arraycopy(ByteUtils.uLongToByteWord(ssrc),0,sendPacket,8,4);
        System.arraycopy(bs,0,sendPacket,12, SipSession.PCMA_STEP_SIZE);
        return sendPacket;
    }

}
